#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string>
#include<stdint.h>
#include<functional>
#include<vector>

using namespace std;

// typedef function<void ()> func;
// vector<func> callbacks;

// uint64_t count = 0;

// void showCount()
// {
//     cout << "final count: " << count << endl;
//     //cout << "进程捕捉到了一个信号，正在处理中：" << signum << " Pid: " << getpid() << endl;
// }

// void logUser()
// {
//     if(fork() == 0)
//     {
//         execl("/usr/bin/who","who",nullptr);
//         exit(1);
//     }
//     wait(nullptr);
// }

// void showLog()
// {
//     cout << "这个是日志功能" << endl;
// }

// //定时器闹钟
// void catchSig(int signum)
// {
//     for(auto &f : callbacks)
//     {
//         f();
//     }
//     alarm(1);
// }

// static void Usage(string proc)
// {
//     cout << "Usage:\r\n\t" << proc << " signumer processid" << endl;
// }

void handler(int signum)
{
    sleep(1);
    cout << "获得了一个信号: " << signum << endl;

}

//./mykill 2 pid
int main(int argc,char *argv[])
{
    // signal(SIGFPE,handler);
    // int a = 100;
    // a /= 0;

    signal(SIGSEGV,handler);

    int* p = nullptr;
    *p = 100;

    while(true) sleep(1);



    // //验证1秒以内，我们一共会有多少次count++
    // //2.如果单纯想计算算力呢？
    // signal(SIGALRM,catchSig);
    // //1.为什么我们只及孙道1w+左右？cout + 网络发送
    // alarm(1);

    // callbacks.push_back(showCount);
    // callbacks.push_back(showLog);
    // callbacks.push_back(logUser);
    // while(true) count++;




    // 调用系统函数自己给自己发信号
    //cout << "我开始运行了" << endl;
    //2     给自己发送确定的abort信号
    //相当于子进程给发6号编号，底层调用的就是rasie(6)
    //abort(); //通常用来终止进程
    //1
    // sleep(1);
    // raise(8); //raise(6)  kill(getpid(),6)


    // 调用系统函数向进程发信号
    // if(argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // int signumber = atoi(argv[1]);
    // int procid = atoi(argv[2]);

    // kill(procid, signumber);




    //signal(2,fun);
    //键盘产生
    //signal(SIGINT,catchSig); //特定信号的处理动作一般只有一个
    //ctrl /
    //signal(SIGQUIT,catchSig); //3
    //signal函数，仅仅是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作 
    //如果后续没有任何SIGINT信号产生，catchSig会不会被调用？永远不会被调用
    // while(true)
    // {
    //     cout << "我是一个进程，我正在运行...,Pid: " << getpid() << endl;
    //     sleep(1);

    //     int a = 100;
    //     a /= 0;
    //     cout << "run here ..." << endl;
    // }
    
    // pid_t id = fork();
    // if(id == 0)
    // {
    //     sleep(100);
    //     int a = 100;
    //     a /= 0;
    //     exit(1);
    // }
    // int status = 0;
    // waitpid(id,&status,0);
    // cout << "父进程：" << getpid() << "子进程：" << id <<\
    // " exit sig: " << (status & 0x7F) << " is core：" << ((status >> 7) & 1) << endl;
    return 0;
} 